
def self_print(obj):
    print(f'值: {obj} id: {id(obj)}')
    return None


def status_print(status, name, **kwargs):
    assert status != 0 or status != 1, "请输入0 或者 1 --- 1: 开始 0: 结束"
    status = 'begin' if status == 1 else 'end'
    # 不知道为什么不生效
    end = "\n\n" if status == 0 else "\n"
    if not len(kwargs.keys()):
        print('-------')
    else:
        for key in kwargs:
            print('---- {} {} {} ----'.format(name, key, status), end=end)
            break
    return None


def list_crud():
    # create
    status_print(1, "list", create=True)
    my_list = [1]
    # 原有值上增加 内存地址不变
    my_list *= 10
    self_print(my_list)
    # 重新赋值 内存地址改变
    my_list = ['a'] * 5
    self_print(my_list)
    # 末尾添加 append 内存地址不变
    my_list.append('b')
    self_print(my_list)
    # 指定位置插入 insert 内存地址不变
    my_list.insert(0, 'c')
    self_print(my_list)
    status_print(0, "list", create=True)

    # retrieve
    status_print(1, "list", retrieve=True)
    self_print(my_list[-1])
    self_print(my_list[1:])
    self_print(my_list[:4])
    self_print(my_list[1:4])
    self_print(my_list[::2])
    # 返回目标值索引
    try:
        my_list.index('c')
    except ValueError:
        print('没有这个值')
    status_print(0, "list", retrieve=True)

    # update 更新
    status_print(1, "list", update=True)
    # 下标更新
    my_list[1] = 'l'
    self_print(my_list)
    # 批量更新
    my_list[2: 5] = ['2']
    self_print(my_list)
    status_print(0, "list", update=True)

    # delete 删除
    status_print(1, "list", delete=True)
    self_print(my_list)
    # 删除末尾元素
    my_list.pop()
    self_print(my_list)
    # 删除指定元素
    my_list.remove('a')
    self_print(my_list)
    status_print(0, "list", delete=True)

    # 其他操作
    status_print(1, "list", more=True)
    self_print(my_list)
    # count 元素在列表中的个数
    print(my_list.count('a'))
    # 排序
    my_list.reverse()
    self_print(my_list)
    # 返回新列表
    self_print(list(reversed(my_list)))
    # sort 原有列表上排序
    my_list.sort()
    self_print(my_list)
    # my_list.sort(key=lambda a, b: a > b)
    self_print(my_list)
    # sortd 返回新列表
    self_print(sorted(my_list))
    status_print(0, "list", more=True)
    return None


def tuple_crud():
    # 不可变序列 只能检索 retrieve
    status_print(1, "tuple", retrieve=True)
    my_tuple = (1, 2, 3)
    self_print(my_tuple[0])
    self_print(my_tuple[:2])
    self_print(my_tuple.index(2))
    status_print(0, "tuple", retrieve=True)
    return None


def dict_crud():
    # create
    status_print(1, "dict", create=True)
    my_dict = {'a': 1, 'b': 2}
    my_dict['c'] = 3
    self_print(my_dict)
    my_dict = {'a': 2}
    self_print(my_dict)
    my_dict.setdefault('x', 123)
    self_print(my_dict)
    status_print(0, "dict", create=True)

    # retrieve
    status_print(1, "dict", retrieve=True)
    my_dict.get('a', 'default_value')
    print(my_dict['a'])
    print(f'keys:{list(my_dict.keys())}')
    print(f'values: {list(my_dict.values())}')
    print(f'items: {list(my_dict.items())}')
    status_print(0, "dict", retrieve=True)

    # update
    status_print(1, "dict", update=True)
    my_dict['a'] = 10086
    self_print(my_dict)
    my_dict.update({'f': 33})
    self_print(my_dict)
    status_print(0, "dict", update=True)

    # delete
    status_print(1, "dict", delete=True)
    # 删除指定元素 返回删除值
    print(my_dict.pop('a'))
    # 删除随机值
    print(my_dict.popitem())
    # 删除所有
    my_dict.clear()
    self_print(my_dict)
    status_print(0, "dict", delete=True)
    return None


def set_crud():
    # set 没有key的字典
    # create
    status_print(1, 'set', create=True)
    my_set = {1, 2, 3}
    my_set.add(1)
    self_print(my_set)
    status_print(0, 'set', create=True)

    # retrieve
    status_print(1, 'set', retrieve=True)
    print(f'a is in my_set? {"a" in my_set}')
    status_print(0, 'set', retrieve=True)

    # update
    status_print(1, 'set', update=True)
    # update 合并
    my_set.update({1, 2, 3, 4})
    self_print(my_set)
    # union 返回两个set的并集 两个set的所有值 跟update返回值一样 只是不更新两个对象
    print(my_set.union({1, 2, 4}))
    status_print(0, 'set', update=True)

    # delete
    status_print(1, 'set', delete=True)
    # remote 没有该元素会报错
    try:
        my_set.remove(4)
    except ValueError:
        print('set里面没有4')
    # discard 没有该元素不会报错
    my_set.discard(4)
    # pop 随机删除一个元素 因为set是无序的
    my_set.pop()
    status_print(0, 'set', delete=True)
    return None


if __name__ == "__main__":
    list_crud()
    tuple_crud()
    dict_crud()
    set_crud()
